home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DTP / DTP_TEX / H220.ZIP / ITRNS211.ZIP / SRC / ILEX.L < prev    next >
Text File  |  1991-10-15  |  15KB  |  383 lines

  1. %e 1500
  2. %p 3100
  3. %a 3000
  4.  
  5. %{
  6. /* above directives increase the various table sizes used by Lex */
  7.  
  8. /*
  9.  *========================================================================== 
  10.  * Copyright 1991 Avinash Chopde, All Rights Reserved.
  11.  *
  12.  * Permission to use, copy, modify and distribute this software and its
  13.  * documentation for any purpose is hereby granted without fee, provided that
  14.  * the above copyright notice appear in all copies and that both that
  15.  * copyright notice and this permission notice appear in supporting
  16.  * documentation, and that the name of Avinash Chopde not be used in
  17.  * advertising or publicity pertaining to distribution of the software
  18.  * without specific, written prior permission.
  19.  * Avinash Chopde makes no representations about the suitability of this
  20.  * software for any purpose.
  21.  * It is provided "as is" without express or implied warranty.
  22.  *
  23.  * AVINASH CHOPDE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  24.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
  25.  * IN NO EVENT SHALL AVINASH CHOPDE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  26.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  27.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  28.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  29.  * OF THIS SOFTWARE.
  30.  *
  31.  * Author:  Avinash Chopde, 1991
  32.  *        C2 Colonial Drive #4, Andover, MA 01810, USA.
  33.  *
  34.  */
  35.  
  36. static char S_RCSID[] = "$Header: e:/itrans/src/rcs/ilex.l 1.8 91/10/15 00:13:49 avinash Exp $";
  37.  
  38. #include "itrans.h"
  39. #include "ifm.h"
  40.  
  41. #ifdef MSDOS
  42. #include "y_tab.h"
  43. #else
  44. #include "y.tab.h"
  45. #endif
  46.  
  47. #ifdef YYSTYPE
  48. extern YYSTYPE  yylval;
  49. #else
  50. extern int yylval;
  51. #endif
  52.  
  53. extern int G_lineno;
  54. extern int in_letter(); /* returns TRUE if the parse (iyacc.y) is in the
  55.              * middle of scanning some letter.
  56.              * Used to decide whether to tell the parser to
  57.              * stop looking for more characters, and
  58.              * terminate the letter.
  59.              * That is done by sending in a ENDPREV_TOK.
  60.              */
  61. extern char G_endprev_str[]; /* defined in iyacc.y, used to pass string
  62.                   * to process
  63.                   */
  64.  
  65. static S_lex_ichar(int t);
  66. static S_print(char* t);
  67. static S_skipcomments();
  68.  
  69. static int    S_lang_tok = -1; /* which language being scanned... */
  70.  
  71. %}
  72.  
  73. %START ITEXT DCOMMAND
  74. %%
  75.  
  76. "\\%"            {   
  77.               /* seen \% in the input, complete current
  78.                * word first, and then echo out
  79.                * the chars in G_endprev_str.
  80.                */
  81.                 if (in_letter()) {
  82.                 S_print("ichar \\ %");
  83.                 strcpy(G_endprev_str, "\\%");
  84.                 return (yylval=ENDPREV_TOK);
  85.                 } else {
  86.                 ECHO;
  87.                 }
  88.             }
  89.  
  90. <ITEXT>"\\"        {   
  91.                /* seen a single backslash */
  92.                if (in_letter()) {
  93.                 /* need to complete current word, send
  94.                  * a ENDPREV token to the parser.
  95.                  */
  96.                 S_print("ichar \\");
  97.                 /* unput('\\');   ?? use yyless() here */
  98.                     yyless(0);
  99.                     G_endprev_str[0] = '\0';
  100.                     return (yylval=ENDPREV_TOK);
  101.                 } else {
  102.                 BEGIN  DCOMMAND;
  103.                 }
  104.             }
  105.  
  106. <ITEXT>"%"        { S_print("ichar %");
  107.                   if (in_letter()) {
  108.                 /* need to complete current word, send
  109.                  * a ENDPREV token to the parser.
  110.                  */
  111.                  /* unput('%'); handle comment next time around */
  112.                  yyless(0);
  113.               }
  114.               return S_skipcomments();
  115.               /* is a comment, until end-of-line */
  116.             }
  117.  
  118. "%"            { S_skipcomments(); putchar('\n'); }
  119.  
  120. <ITEXT>"a"        {S_lex_ichar(A_TOK); return (yylval =  A_TOK);    }
  121. <ITEXT>"aa"        {S_lex_ichar(AA_TOK); return (yylval =  AA_TOK);}
  122. <ITEXT>"A"        {S_lex_ichar(AA_TOK); return (yylval =  AA_TOK);}
  123. <ITEXT>"i"        {S_lex_ichar(I_TOK); return (yylval =  I_TOK);    }
  124. <ITEXT>"ii"        {S_lex_ichar(II_TOK); return (yylval =  II_TOK);}
  125. <ITEXT>"I"        {S_lex_ichar(II_TOK); return (yylval =  II_TOK);}
  126. <ITEXT>"u"        {S_lex_ichar(U_TOK); return (yylval =  U_TOK);    }
  127. <ITEXT>"U"        {S_lex_ichar(UU_TOK); return (yylval =  UU_TOK);}
  128. <ITEXT>"uu"        {S_lex_ichar(UU_TOK); return (yylval =  UU_TOK);}
  129. <ITEXT>"Ri"        {
  130.               switch(S_lang_tok) {
  131.               case TAMIL_TOK:
  132.                   /* unput('i'); ?? use yyless() here XXX */
  133.                   yyless(1);
  134.                   return (yylval =  RRA_TOK);
  135.                   break;
  136.               default:
  137.                   return (yylval =  RI_TOK);
  138.               }
  139.             }
  140. <ITEXT>"RI"        {
  141.               switch(S_lang_tok) {
  142.               case TAMIL_TOK:
  143.                   /* unput('I'); ?? use yyless() here XXX */
  144.                   yyless(1);
  145.                   return (yylval =  RRA_TOK);
  146.                   break;
  147.               default:
  148.                   return (yylval =  RII_TOK);
  149.               }
  150.             }
  151. <ITEXT>"Li"        {
  152.               switch(S_lang_tok) {
  153.               case TAMIL_TOK:
  154.                   /* unput('i'); ?? use yyless() here XXX */
  155.                   yyless(1);
  156.                   return (yylval =  LDA_TOK);
  157.                   break;
  158.               default:
  159.                   return (yylval =  LI_TOK);
  160.               }
  161.             }
  162. <ITEXT>"LI"        {
  163.               switch(S_lang_tok) {
  164.               case TAMIL_TOK:
  165.                   /* unput('I'); ?? use yyless() here XXX */
  166.                   yyless(1);
  167.                   return (yylval =  LDA_TOK);
  168.                   break;
  169.               default:
  170.                   return (yylval =  LII_TOK);
  171.               }
  172.             }
  173. <ITEXT>"e"        {S_lex_ichar(AY_TOK); return (yylval =  AY_TOK);}
  174. <ITEXT>"E"        {S_lex_ichar(AAY_TOK); return (yylval =  AAY_TOK);}
  175. <ITEXT>"ai"        {S_lex_ichar(AI_TOK); return (yylval =  AI_TOK);}
  176. <ITEXT>"o"        {S_lex_ichar(O_TOK); return (yylval =  O_TOK);    }
  177. <ITEXT>"O"        {S_lex_ichar(OO_TOK); return (yylval =  OO_TOK);}
  178. <ITEXT>"au"        {S_lex_ichar(AU_TOK); return (yylval =  AU_TOK);}
  179. <ITEXT>"aM"        {S_lex_ichar(AM_TOK); return (yylval =  AM_TOK);}
  180. <ITEXT>"H"        {S_lex_ichar(AHA_TOK); return (yylval =  AHA_TOK);}
  181. <ITEXT>"k"        {S_lex_ichar(KA_TOK); return (yylval =  KA_TOK);}
  182. <ITEXT>"q"        {S_lex_ichar(KADOT_TOK); return (yylval =  KADOT_TOK);}
  183. <ITEXT>"kh"        {S_lex_ichar(KHA_TOK); return (yylval =  KHA_TOK);}
  184. <ITEXT>"K"        {S_lex_ichar(KHADOT_TOK); return (yylval = KHADOT_TOK);}
  185. <ITEXT>"gh"        {S_lex_ichar(GHA_TOK); return (yylval =  GHA_TOK);}
  186. <ITEXT>"g"        {S_lex_ichar(GA_TOK); return (yylval =  GA_TOK);}
  187. <ITEXT>"G"        {S_lex_ichar(GADOT_TOK); return (yylval =  GADOT_TOK);}
  188. <ITEXT>"ng"        {S_lex_ichar(NGA_TOK); return (yylval =  NGA_TOK);}
  189. <ITEXT>"chh"        {S_lex_ichar(CHHA_TOK); return (yylval =  CHHA_TOK);}
  190. <ITEXT>"ch"        {S_lex_ichar(CHA_TOK); return (yylval =  CHA_TOK);}
  191. <ITEXT>"j"        {S_lex_ichar(JA_TOK); return (yylval =  JA_TOK);}
  192. <ITEXT>"z"        {S_lex_ichar(JADOT_TOK); return (yylval =  JADOT_TOK);}
  193. <ITEXT>"jh"        {S_lex_ichar(JHA_TOK); return (yylval =  JHA_TOK);}
  194. <ITEXT>"jn"        {S_lex_ichar(JNH_TOK); return (yylval =  JNH_TOK);}
  195. <ITEXT>"T"        {S_lex_ichar(TTA_TOK); return (yylval =  TTA_TOK);}
  196. <ITEXT>"Th"        {S_lex_ichar(TTHA_TOK); return (yylval =  TTHA_TOK);}
  197. <ITEXT>"D"        {S_lex_ichar(DDA_TOK); return (yylval =  DDA_TOK);}
  198. <ITEXT>".D"        {S_lex_ichar(DDADOT_TOK);return (yylval=DDADOT_TOK);}
  199. <ITEXT>"Dh"        {S_lex_ichar(DDHA_TOK); return (yylval =  DDHA_TOK);}
  200. <ITEXT>".Dh"        {S_lex_ichar(DDHADOT_TOK);return (yylval=DDHADOT_TOK);}
  201. <ITEXT>"N"        {S_lex_ichar(NNA_TOK); return (yylval =  NNA_TOK);}
  202. <ITEXT>"t"        {S_lex_ichar(TA_TOK); return (yylval =  TA_TOK);}
  203. <ITEXT>"th"        {S_lex_ichar(THA_TOK); return (yylval =  THA_TOK);}
  204. <ITEXT>"d"        {S_lex_ichar(DA_TOK); return (yylval =  DA_TOK);}
  205. <ITEXT>"dh"        {S_lex_ichar(DHA_TOK); return (yylval =  DHA_TOK);}
  206. <ITEXT>"n"        {S_lex_ichar(NA_TOK); return (yylval =  NA_TOK);}
  207. <ITEXT>"p"        {S_lex_ichar(PA_TOK); return (yylval =  PA_TOK);}
  208. <ITEXT>"ph"        {S_lex_ichar(PHA_TOK); return (yylval =  PHA_TOK);}
  209. <ITEXT>"f"        {S_lex_ichar(PHADOT_TOK); return (yylval = PHADOT_TOK);}
  210. <ITEXT>"bh"        {S_lex_ichar(BHA_TOK); return (yylval =  BHA_TOK);}
  211. <ITEXT>"b"        {S_lex_ichar(BA_TOK); return (yylval =  BA_TOK);}
  212. <ITEXT>"m"        {S_lex_ichar(MA_TOK); return (yylval =  MA_TOK);}
  213. <ITEXT>"y"        {S_lex_ichar(YA_TOK); return (yylval =  YA_TOK);}
  214. <ITEXT>"r"        {S_lex_ichar(RA_TOK); return (yylval =  RA_TOK);}
  215. <ITEXT>"v"        {S_lex_ichar(VA_TOK); return (yylval =  VA_TOK);}
  216. <ITEXT>"shh"        {S_lex_ichar(SHHA_TOK); return (yylval =  SHHA_TOK);}
  217. <ITEXT>"sh"        {S_lex_ichar(SHA_TOK); return (yylval =  SHA_TOK);}
  218. <ITEXT>"s"        {S_lex_ichar(SA_TOK); return (yylval =  SA_TOK);}
  219. <ITEXT>"h"        {S_lex_ichar(HA_TOK); return (yylval =  HA_TOK);}
  220. <ITEXT>"ld"        {S_lex_ichar(LDA_TOK); return (yylval =  LDA_TOK);}
  221. <ITEXT>"L"        {S_lex_ichar(LDA_TOK); return (yylval =  LDA_TOK);}
  222. <ITEXT>"l"        {S_lex_ichar(LA_TOK); return (yylval =  LA_TOK);}
  223. <ITEXT>"ksh"        {S_lex_ichar(KSHA_TOK); return (yylval =  KSHA_TOK);}
  224. <ITEXT>"x"        {S_lex_ichar(KSHA_TOK); return (yylval =  KSHA_TOK);}
  225. <ITEXT>"gy"        {S_lex_ichar(GYA_TOK); return (yylval =  GYA_TOK);}
  226.  
  227. <ITEXT>"ny"        {
  228.               switch(S_lang_tok) {
  229.               case TAMIL_TOK:
  230.                   return (yylval =  NYA_TOK);
  231.                   break;
  232.               default:
  233.                   /* unput('y'); ?? use yyless() here XXX */
  234.                   yyless(1);
  235.                   return (yylval =  NA_TOK);
  236.               }
  237.             }
  238. <ITEXT>"n^"        { return (yylval =  NNX_TOK);} /* Tamil Only */
  239.  
  240. <ITEXT>"R"        {S_lex_ichar(RRA_TOK); return (yylval =  RRA_TOK);}
  241.  
  242. <ITEXT>"AUM"        {S_lex_ichar(AUM_TOK); return (yylval =  AUM_TOK);}
  243. <ITEXT>"SRI"        {S_lex_ichar(SRI_TOK); return (yylval =  SRI_TOK);}
  244. <ITEXT>".r"        {S_lex_ichar(RA_HALF_TOK);return (yylval=RA_HALF_TOK);}
  245. <ITEXT>".n"          {S_lex_ichar(ANUSVARA_TOK);return(yylval=ANUSVARA_TOK);}
  246. <ITEXT>".h"        {S_lex_ichar(VIRAAM_TOK);return(yylval=VIRAAM_TOK);}
  247. <ITEXT>".c"        {S_lex_ichar(CHANDRA_TOK);return(yylval= CHANDRA_TOK);}
  248. <ITEXT>".C"        {S_lex_ichar(CHANDRA_BN_TOK);return(yylval=CHANDRA_BN_TOK);}
  249. <ITEXT>".a"         {S_lex_ichar(AVAGRAHA_TOK);return(yylval=AVAGRAHA_TOK);}
  250.  
  251. <ITEXT>[ \t]        {S_print("ichar \t");return (yylval =  BLANK_TOK);}
  252. <ITEXT>[\n]        {S_print("ichar \n");G_lineno++;return(yylval=NEWLINE_TOK);}
  253.  
  254. <ITEXT>"{}"         {    S_print("ichar {}");
  255.                 if (in_letter()) {
  256.                 return (yylval=NOLIG_TOK);
  257.             } else {
  258.                 strcpy(G_endprev_str, yytext);
  259.                 return (yylval=ENDPREV_TOK);
  260.                 }
  261.             }
  262.  
  263. <ITEXT>.         {    S_print("ichar .");
  264.             strcpy(G_endprev_str, yytext);
  265.             return (yylval=ENDPREV_TOK);
  266.             }
  267.  
  268. <DCOMMAND>[a-zA-Z][\.\-a-zA-Z0-9]* {
  269.             S_print("dcommand a-z");
  270.             BEGIN ITEXT;
  271.             return (COMMAND_TOK);
  272.         }
  273.  
  274. <DCOMMAND>.    {
  275.             S_print("dcommand other");
  276.             process_otherchar('\\');
  277.             process_otherchar(yytext[0]);
  278.             BEGIN ITEXT;
  279.         }
  280.  
  281. \\indian[ \t]*        {BEGIN ITEXT; return (S_lang_tok = ILANG_TOK);}
  282. \\endindian[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  283. \\marathi[ \t]*        {BEGIN ITEXT; return (S_lang_tok = MARATHI_TOK);}
  284. \\endmarathi[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  285. \\hindi[ \t]*        {BEGIN ITEXT; return (S_lang_tok = HINDI_TOK);}
  286. \\endhindi[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  287. \\tamil[ \t]*        {BEGIN ITEXT; return (S_lang_tok = TAMIL_TOK);}
  288. \\endtamil[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  289. \\sanskrit[ \t]*    {BEGIN ITEXT; return (S_lang_tok = SANSKRIT_TOK);}
  290. \\endsanskrit[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  291. \\bengali[ \t]*        {BEGIN ITEXT; return (S_lang_tok = BENGALI_TOK);}
  292. \\endbengali[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  293. \\telugu[ \t]*        {BEGIN ITEXT; return (S_lang_tok = TELUGU_TOK);}
  294. \\endtelugu[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  295. \\malayalam[ \t]*    {BEGIN ITEXT; return (S_lang_tok = MALAYALAM_TOK);}
  296. \\endmalayalam[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  297. \\gujarati[ \t]*    {BEGIN ITEXT; return (S_lang_tok = GUJARATI_TOK);}
  298. \\endgujarati[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  299. \\oriya[ \t]*        {BEGIN ITEXT; return (S_lang_tok = ORIYA_TOK);}
  300. \\endoriya[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  301. \\kannada[ \t]*        {BEGIN ITEXT; return (S_lang_tok = KANNADA_TOK);}
  302. \\endkannada[ \t]*    {BEGIN 0;     return (S_lang_tok = ENDLANG_TOK);}
  303.  
  304. \\indianifm=[a-zA-Z0-9_\-\.]*    {yylval = ILANG_TOK; return SETIFM_TOK;}
  305. \\marathiifm=[a-zA-Z0-9_\-\.]*    {yylval = MARATHI_TOK; return SETIFM_TOK;}
  306. \\hindiifm=[a-zA-Z0-9_\-\.]*    {yylval = HINDI_TOK; return SETIFM_TOK;}
  307. \\tamilifm=[a-zA-Z0-9_\-\.]*    {yylval = TAMIL_TOK; return SETIFM_TOK;}
  308. \\sanskritifm=[a-zA-Z0-9_\-\.]*    {yylval = SANSKRIT_TOK; return SETIFM_TOK;}
  309. \\bengaliifm=[a-zA-Z0-9_\-\.]*    {yylval = BENGALI_TOK; return SETIFM_TOK;}
  310. \\teluguifm=[a-zA-Z0-9_\-\.]*    {yylval = TELUGU_TOK; return SETIFM_TOK;}
  311. \\malayalamifm=[a-zA-Z0-9_\-\.]* {yylval = MALAYALAM_TOK; return SETIFM_TOK;}
  312. \\gujaratiifm=[a-zA-Z0-9_\-\.]*    {yylval = GUJARATI_TOK; return SETIFM_TOK;}
  313. \\oriyaifm=[a-zA-Z0-9_\-\.]*    {yylval = ORIYA_TOK; return SETIFM_TOK;}
  314. \\kannadaifm=[a-zA-Z0-9_\-\.]*    {yylval = KANNADA_TOK; return SETIFM_TOK;}
  315.  
  316. \\indianfont=[a-zA-Z0-9_\-\.\\]* {yylval = ILANG_TOK; return SETFONT_TOK;}
  317. \\hindifont=[a-zA-Z0-9_\-\.\\]*    {yylval = HINDI_TOK; return SETFONT_TOK;}
  318. \\tamilfont=[a-zA-Z0-9_\-\.\\]* {yylval = TAMIL_TOK; return SETFONT_TOK;}
  319. \\marathifont=[a-zA-Z0-9_\-\.\\]* {yylval = MARATHI_TOK; return SETFONT_TOK;}
  320. \\sanskritfont=[a-zA-Z0-9_\-\.\\]* {yylval = SANSKRIT_TOK; return SETFONT_TOK;}
  321. \\bengalifont=[a-zA-Z0-9_\-\.\\]* {yylval = BENGALI_TOK; return SETFONT_TOK;}
  322. \\telugufont=[a-zA-Z0-9_\-\.\\]* {yylval = TELUGU_TOK; return SETFONT_TOK;}
  323. \\malayalamfont=[a-zA-Z0-9_\-\.\\]* {yylval = MALAYALAM_TOK;return SETFONT_TOK;}
  324. \\gujaratifont=[a-zA-Z0-9_\-\.\\]* {yylval = GUJARATI_TOK; return SETFONT_TOK;}
  325. \\oriyafont=[a-zA-Z0-9_\-\.\\]* {yylval = ORIYA_TOK; return SETFONT_TOK;}
  326. \\kannadafont=[a-zA-Z0-9_\-\.\\]* {yylval = KANNADA_TOK; return SETFONT_TOK;}
  327.  
  328. \n        {S_print("got newline\n");G_lineno++; ECHO;        }
  329. .        {S_print("everything else! got .");ECHO;        }
  330.  
  331. %%
  332.  
  333. static S_lex_ichar(int t)
  334. {
  335. #ifdef DEBUG
  336.     if (t > 255) fprintf(stderr, "LEXER: have seen <%s> tok %d (I %d)\n",
  337.                 yytext, t, _I_(t));
  338.     else fprintf(stderr, "LEXER: seen char %c (dec %d)\n", t, t);
  339. #endif /*DEBUG*/
  340.     return TRUE;
  341. }
  342. static S_print(char* t)
  343. {
  344. #ifdef DEBUG
  345.     fprintf(stderr, "LEXERprint: have seen <%s> rule is %s\n",
  346.                 yytext, t);
  347. #endif /*DEBUG*/
  348.     return TRUE;
  349. }
  350.  
  351. static S_skipcomments()
  352. {
  353.      int c;
  354.      if (in_letter()) {
  355.      G_endprev_str[0] = '\0';
  356.      return (yylval=ENDPREV_TOK);
  357.      } else {
  358.      /* this the next time around, eat up the comment */
  359.      putchar('%');
  360.      while ( (c = input()) != EOF && c != '\n')
  361.         putchar(c);
  362.  
  363.      G_lineno++;
  364.      return (yylval=NEWLINE_TOK);
  365.      }
  366. }
  367.  
  368. #ifdef NOLEX
  369. /* if the system is missing lex, add these functions */
  370. #ifdef yywrap
  371. #undef yywrap
  372. #endif
  373. int yywrap() { return 1; }
  374.  
  375. int yyless(int n) /* NOT TESTED!*/
  376. {
  377.     int i;
  378.     extern int yyleng;
  379.     for (i = yyleng - 1; i >= n; i --) unput(yytext[i]);
  380. }
  381. #endif
  382.  
  383.